題目:
這題要求我們計算二元樹中任意兩個節點之間的最大距離,這段距離被稱為二元樹的「直徑」。直徑的長度是透過兩個節點間的邊數來衡量的,而不一定需要經過樹根。
二元樹找任意兩節點有最大的直徑,就是尋找樹中某節點的左子樹深度加上右子樹深度相加是最大直徑,
這邊使用 DFS 遞迴後序的方式來計算深度,同時嘗試更新最大直徑,
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int diameterOfBinaryTree(TreeNode* root) {
int maxDiameter = 0;
dfs(root, maxDiameter);
return maxDiameter;
}
private:
int dfs(TreeNode* root, int& maxDiameter) {
if (root == nullptr) {
return 0; // 空節點回傳深度0
}
int leftDepth = dfs(root->left, maxDiameter);
int rightDepth = dfs(root->right, maxDiameter);
// 更新最大直徑
maxDiameter = max(maxDiameter, leftDepth+rightDepth);
// 回傳當前節點的深度
return max(leftDepth, rightDepth)+1;
}
};
參考:
#543. Diameter of Binary Tree